popover: allow setting popup layout offset
authorChristian Hergert <chergert@redhat.com>
Sat, 8 Aug 2020 00:06:08 +0000 (17:06 -0700)
committerChristian Hergert <chergert@redhat.com>
Sat, 8 Aug 2020 00:10:52 +0000 (17:10 -0700)
Currently there is no way to alter the offset of the popup when positioning
with GdkPopupLayout. This makes using the popup difficult for scenarios
like completion windows where you may need to offset the window by a given
amount for aligning text.

gtk_popover_set_offset() allows setting these values and are analagous to
the function of the same name for GdkPopupLayout.

docs/reference/gtk/gtk4-sections.txt
gtk/gtkpopover.c
gtk/gtkpopover.h

index d96884bb94e9bba9eb40c9863255786f50fdf428..5b23420dafce18fa0012d4cb537d92b8819505a5 100644 (file)
@@ -6270,6 +6270,8 @@ gtk_popover_set_autohide
 gtk_popover_get_autohide
 gtk_popover_set_has_arrow
 gtk_popover_get_has_arrow
+gtk_popover_set_offset
+gtk_popover_get_offset
 gtk_popover_set_default_widget
 <SUBSECTION Standard>
 GTK_TYPE_POPOVER
index d2d36ead63e24e57c7c1c481e5a0e5e4f2463947..72a5451647b571804cca34e456f00ee56bd6807e 100644 (file)
@@ -150,6 +150,9 @@ typedef struct {
   gboolean mnemonics_visible;
   gboolean disable_auto_mnemonics;
 
+  int x_offset;
+  int y_offset;
+
   guint mnemonics_display_timeout_id;
 
   GtkWidget *child;
@@ -550,6 +553,9 @@ create_popup_layout (GtkPopover *popover)
                                  surface_anchor);
   gdk_popup_layout_set_anchor_hints (layout, anchor_hints);
 
+  if (priv->x_offset || priv->y_offset)
+    gdk_popup_layout_set_offset (layout, priv->x_offset, priv->y_offset);
+
   return layout;
 }
 
@@ -2162,3 +2168,56 @@ gtk_popover_disable_auto_mnemonics (GtkPopover *popover)
 
   priv->disable_auto_mnemonics = TRUE;
 }
+
+/**
+ * gtk_popover_set_offset:
+ * @popover: a #GtkPopover
+ * @x_offset: the x offset to adjust the position by
+ * @y_offset: the y offset to adjust the position by
+ *
+ * Sets the offset to use when calculating the position of the popover.
+ *
+ * These values are used when preparing the #GtkPopupLayout for positioning
+ * the popover.
+ */
+void
+gtk_popover_set_offset (GtkPopover *popover,
+                        int         x_offset,
+                        int         y_offset)
+{
+  GtkPopoverPrivate *priv = gtk_popover_get_instance_private (popover);
+
+  g_return_if_fail (GTK_IS_POPOVER (popover));
+
+  if (priv->x_offset != x_offset || priv->y_offset != y_offset)
+    {
+      priv->x_offset = x_offset;
+      priv->y_offset = y_offset;
+
+      gtk_widget_queue_resize (GTK_WIDGET (popover));
+    }
+}
+
+/**
+ * gtk_popover_get_offset:
+ * @popover: a #GtkPopover
+ * @x_offset: (out) (nullable): a location for the x_offset
+ * @y_offset: (out) (nullable): a location for the y_offset
+ *
+ * Gets the offset previous set with gtk_popover_set_offset().
+ */
+void
+gtk_popover_get_offset (GtkPopover *popover,
+                        int        *x_offset,
+                        int        *y_offset)
+{
+  GtkPopoverPrivate *priv = gtk_popover_get_instance_private (popover);
+
+  g_return_if_fail (GTK_IS_POPOVER (popover));
+
+  if (x_offset)
+    *x_offset = priv->x_offset;
+
+  if (y_offset)
+    *y_offset = priv->y_offset;
+}
index 965ad195d5d8841d031988966fe25ca108d05f1d..a27fdf431a414b982ec82fc19997b45d19352232 100644 (file)
@@ -103,6 +103,15 @@ void            gtk_popover_popup (GtkPopover *popover);
 GDK_AVAILABLE_IN_ALL
 void            gtk_popover_popdown (GtkPopover *popover);
 
+GDK_AVAILABLE_IN_ALL
+void            gtk_popover_set_offset (GtkPopover *popover,
+                                        int         x_offset,
+                                        int         y_offset);
+GDK_AVAILABLE_IN_ALL
+void            gtk_popover_get_offset (GtkPopover *popover,
+                                        int        *x_offset,
+                                        int        *y_offset);
+
 GDK_AVAILABLE_IN_ALL
 void gtk_popover_set_default_widget (GtkPopover *popover,
                                      GtkWidget  *widget);